#pragma once
//在这里面去写核心类
#include<QString>
#include<QIcon>
#include<QUuid>
#include<QDateTime>
#include<QFile>
#include<QFileInfo>
#pragma once
namespace  model
{
#define TAG "[" << __LINE__ << "]"
#define LOG() qDebug().noquote() << TAG
///////////////////////
//工具类函数，多个地方都能用到
//////////////////////////
//写一下打印日志的宏，我们希望打印格式可以按照我们自定义的格式打印，而不是单纯的debug() 希望打印文件名与行号
static inline QString getFileName(const QString&path)
{
//QFileInfo ,文件的相关属性
QFileInfo fileInfo(path);
return fileInfo.fileName();

}
// 封装一个 "宏" 作为打印日志的方式.

// #define TAG "[" << __LINE__ << "]"
// qDebug 打印字符串的时候, 就会自动加上 " "


//里面有时间挫
static inline QString formatTime(int64_t timestamp)
{
    //通过事件挫生成时间
    QDateTime date=QDateTime::fromSecsSinceEpoch(timestamp);
    return date.toString("MM-dd HH:mm:ss");
}
//通过这个函数得到秒级的时间
static inline int64_t getTime()
{
    return  QDateTime::currentSecsSinceEpoch();
}
//再写一些工具类函数
//将QByteArray转换成图标
static inline QIcon QByteArrayToQicon(const QByteArray&byteArray)
{
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);//重点是将二进制数据直接转换成图片
    QIcon icon(pixmap);
    return icon;
}
//一些文件操作
//将二进制数据写入文件中
static inline void WriteQByteArrayToFile(const QString&path,const QByteArray&byteArray)
{
    QFile file(path);
    //文件只写
    bool ok = file.open(QFile::WriteOnly);

    if(!ok)
    {
       LOG()<<"文件打开失败";
        return ;
     }

    file.write(byteArray);
    //内容写进去了之后刷新缓冲区
    file.flush();
    file.close();
}
//从文件中加载二进制数据
static inline QByteArray LoadFileToByteArray(const QString&path)
{

    QFile file(path);
    bool ok=file.open(QFile::ReadOnly);//只读的方式
    if(!ok)
    {
         LOG()<<"文件打开失败";
        return QByteArray() ;
    }

     QByteArray byteArray=file.readAll();
    file.close();
    return byteArray;
}






///////////////////////
//用户信息相关的类
//////////////////////////
class UserInfo
{
public:
    QString userId="";//用户id
    QString name="";//用户昵称
    QString description="";//用户签名
    QString phone="";//用户电话
    QIcon avatar;//用户头像

};


///////////////////////
//消息相关的类,
//////////////////////////
//这里要用到工厂模式（确保构造函数足够），static函数
enum MessageType
{
    SOUND_TYPE,
    TEXT_TYPE,
    FILE_TYPE,
    IMAGE_TYPE,
};

class Message{
    //消息类型
public:
    QString messageId="";//消息编号
    QString chatMessionId="";//消息所属会话编号
    MessageType messageType=TEXT_TYPE;//文件类型
    QString time="";//发送消息的事件
     UserInfo sender;//发送消息的人
    QByteArray content;//文件，图片等的存储是二进制形式
    QString fileId="";//文件的编号，通过编号去后台找文件
    QString fileName="";//文件类型的消息需要显示我们的文件名字，然后可点击，再另存为


    static Message makeMessage(MessageType messageType,const QString &chatMessionId,const  UserInfo&sender,const QByteArray&content,const QString&extraInfo)
    {
        if(messageType==TEXT_TYPE)
        {
           return makeTextMessage(chatMessionId,sender,content);
        }
        else if(messageType==FILE_TYPE)
        {
            return makeFileMessage(chatMessionId,sender,content,extraInfo);
        }
        else if(messageType==IMAGE_TYPE)
        {
            return makeImageMessage(chatMessionId,sender,content);
        }
        else if(messageType==SOUND_TYPE)
        {
                return makeSoungMessage(chatMessionId,sender,content);
        }
              else
            return Message();
    }
    //生成唯一id
  static  QString makeId()
    {
        return "M"+QUuid::createUuid().toString().sliced(25,12);
    }


private:
    static Message makeTextMessage(const QString &chatMessionId,const UserInfo&sender,const QByteArray&content)
    {

        Message message;
        message.content=content;
        message.messageId=makeId();
        message.messageType=TEXT_TYPE;
        message.time=formatTime(getTime());
        message.chatMessionId=chatMessionId;
        message.sender=sender;
        //下面两个属性不使用，用空字符串。
        message.fileId="";
        message.fileName="";
        return message;

    }
    static  Message makeFileMessage(const QString &chatMessionId,const UserInfo&sender,const QByteArray&content,const QString&fileName)
    {
        Message message;
        message.content=content;
        message.messageId=makeId();
        message.messageType=FILE_TYPE;
        message.time=formatTime(getTime());
        message.chatMessionId=chatMessionId;
        message.sender=sender;
        //下面两个属性不使用，用空字符串。
        message.fileId="";
        message.fileName=fileName;
         return message;
    }
    static  Message makeImageMessage(const QString &chatMessionId,const UserInfo&sender,const QByteArray&content)
    {
        Message message;
        message.content=content;
        message.messageId=makeId();
        message.messageType=IMAGE_TYPE;
        message.time=formatTime(getTime());
        message.chatMessionId=chatMessionId;
        message.sender=sender;
           message.fileId="";
        //下面属性暂时不使用，用空字符串。
        message.fileName="";
         return message;
    }
    static  Message makeSoungMessage(const QString &chatMessionId,const UserInfo&sender,const QByteArray&content)
    {
        Message message;
        message.content=content;
        message.messageId=makeId();
        message.messageType= SOUND_TYPE;
        message.time=formatTime(getTime());
        message.chatMessionId=chatMessionId;
        message.sender=sender;
        //下面两个属性不使用，用空字符串。
        message.fileId="";
        message.fileName="";
         return message;

    }


};

///////////////////////
//会话相关的类
//////////////////////////
class ChatMessionInfo{
public:
    QString chatMessionId="";//会话id
    QString chatMessionName="";//会话名称，如果是单人显示呢称，群显示群名
    Message lastMessage;//最后一条消息，用于会话外面的提示作用
    QIcon avatar;//个人显示头像，群聊显示群头
    UserInfo chatPartner;//会话外面显示聊天的对象，个人，群聊

};

}//data命名空间结束
